home *** CD-ROM | disk | FTP | other *** search
/ Info-Mac 4 / Info_Mac IV CD-ROM (Pacific HiTech Inc.)(August 1994).iso / Configuration / TE3Click 1.0 folder / Source Code / TE3Click patch.c < prev   
C/C++ Source or Header  |  1994-03-08  |  3KB  |  106 lines

  1. /*
  2.  *    TE3CLICK PROJECT
  3.  *    PATCH CODE
  4.  *
  5.  *    Copyright © 1994 Marco Piovanelli
  6.  *    All Rights Reserved
  7.  */
  8.  
  9. /*    low-memory globals */
  10.  
  11. extern long     DoubleTime        : 0x2F0;
  12. extern void *    TEFindWord        : 0x7F8;
  13.  
  14. void main(void)
  15. {
  16.     asm {
  17.             bra.s @entry                ; entry point
  18. @daisy        dc.l 0x00000000                ; original address
  19.  
  20. /*
  21.  *    This is a version of TEClick that allows triple clicks to select lines.
  22.  *    Basically, it works by temporarily replacing the global hook TEFindWord
  23.  *    just before calling TEClick.
  24.  *
  25.  *  pascal void TEClick(Point pt, Boolean extend, TEHandle hTE)
  26.  */
  27.  
  28. @entry        link a6, #0                    ; 
  29.             movem.l d7/a3-a4, -(sp)        ; 
  30.             movea.l 8(a6), a3            ; a3 = handle to TextEdit record
  31.             movea.l (a3), a4            ; a4 = ptr to TextEdit record
  32.             clr.b d7                    ; 
  33.             move.w 32(a4), d0            ; 
  34.             cmp.w 34(a4), d0            ; empty selection range?
  35.             beq @1                        ; 
  36.             clr.l -(sp)                    ; 
  37.             _TickCount                    ; 
  38.             move.l 46(a4), d0            ; get clickTime
  39.             add.l DoubleTime, d0        ; d0 = clickTime + doubleTime
  40.             cmp.l (sp)+, d0                ; sufficiently close in time to previous click?
  41.             ble @1                        ; 
  42.             move.w 50(a4), -(sp)        ; get clickLoc (text offset of previous click)
  43.             clr.w -(sp)                    ; reserve space for function result
  44.             move.l 14(a6), -(sp)        ; push pt
  45.             move.l a3, -(sp)            ; push hTE
  46.             _TEGetOffset                ; 
  47.             move.w (sp)+, d0            ; d0 = current text offset
  48.             cmp.w (sp)+, d0                ; compare with text offset of previous click
  49.             seq d7                        ; 
  50. @1            tst.b d7                    ; 
  51.             beq.s @2                    ; 
  52.             move.l TEFindWord, -(sp)    ; save TEFindWord
  53.             lea @findline, a0            ; 
  54.             move.l a0, TEFindWord        ; store our own routine
  55. @2            move.l 14(a6), -(sp)        ; push pt
  56.             move.b 12(a6), -(sp)        ; push extend
  57.             move.l a3, -(sp)            ; push hTE
  58.             move.l @daisy, a0            ; 
  59.             jsr (a0)                    ; call original _TEClick
  60.             tst.b d7                    ; 
  61.             beq.s @3                    ; 
  62.             move.l (sp)+, TEFindWord    ; restore TEFindWord
  63. @3            movem.l (sp)+, d7/a3-a4        ; 
  64.             unlk a6                        ; 
  65.             move.l (sp)+, a0            ; pop return address
  66.             lea 10(sp), sp                ; clean up stack
  67.             jmp (a0)                    ; return to caller
  68.             
  69. @findline    movem.l a4/d4-d7, -(sp)        ; 
  70.             move.w d0, d4                ; d4 = text offset
  71.             cmp.w 60(a3), d4            ; offset >= pTE->teLength?
  72.             bge.s @5                    ; 
  73.             
  74.             moveq #0, d7                ; d7 = minIndex = 0
  75.             move.w 94(a3), d6            ; d6 = maxIndex = pTE->nLines
  76.             
  77. @loop        move.w d7, d5                ; 
  78.             add.w d6, d5                ; 
  79.             asr.w #1, d5                ; d5 = index = (minIndex + maxIndex) / 2
  80.             movea.w d5, a4                ; 
  81.             adda.w a4, a4                ; 
  82.             adda.l a3, a4                ; 
  83.             move.w 96(a4), d0            ; d0 = pTE->lineStarts[index]
  84.             cmp.w d4, d0                ; 
  85.             bgt.s @4                    ; 
  86.             addq.w #1, d5                ; 
  87.             movea.w d5, a4                ; 
  88.             adda.w a4, a4                ; 
  89.             adda.l a3, a4                ; 
  90.             move.w 96(a4), d1            ; d1 = pTE->lineStarts[++index]
  91.             cmp.w d4, d1                ; 
  92.             bgt.s @found                ; line found
  93.  
  94.             move.w d5, d7                ; minIndex = index
  95.             bra.s @loop                    ; 
  96.  
  97. @4            move.w d5, d6                ; maxIndex = index
  98.             bra.s @loop                    ; 
  99.             
  100. @5            move.w d0, d1                ; 
  101.             
  102. @found        movem.l (sp)+, a4/d4-d7        ;     
  103.                                         ; implicit rts
  104.     }
  105. }
  106.